class: inverse,left, middle background-image: url(background.png) background-size: cover <img src="data:image/png;base64,#LOGO_DIPLOMADO.png" width="500px"/> ##Módulo 3: Análisis masivo de datos satelitales y Google Earth Engine [GEE] ### Introducción a Google Earth Engine y JavaScript José A. Lastra<br> <a href="http://github.com/JoseLastra"> Github: JoseLastra</a><br> <a href="mailto:jose.lastra@pucv.cl"> jose.lastra@pucv.cl</a> | <a href="mailto:jose.lastramunoz@wur.nl"> jose.lastramunoz@wur.nl</a><br> .large[<b><a href="https://www.pucv.cl/uuaa/site/edic/base/port/labgrs.html">LabGRS</a> | Noviembre, 2024</b>] <br> --- class: center,middle background-image: url(data:image/png;base64,#labgrs_logo.png) background-size: 35% --- ## Contenidos. .pull-left[ 1) ¿Qué es Google Earth Engine?. 2) Catálogo de datos disponibles. 3) Ventajas y desventajas de GEE. 4) Interfaz. 5) Introducción a JavaScript y familiarización con la consola. <details> * Objetos comunes de JavaScript * Contenedores de GEE </details> ] <p align="right"> <img src="data:image/png;base64,#GEE.gif" alt="animated" width="400px" /> </p> --- ### ¿Qué es Google Earth Engine? > Es una plataforma basada en la nube para el análisis geoespacial a escala planetaria que ofrece las capacidades computacionales masivas de Google permitiendo abordar una variedad de problemas sociales de alto impacto como: deforestación, sequÃa, desastres, enfermedades, seguridad alimentaria, gestión del agua, monitoreo del clima y protección del medio ambiente (Gorelick et al., 2017). > <center><img src="data:image/png;base64,#cloud_computing.png" width="400px"/></center> --- ### ¿Cómo podemos usar GEE? -- - GEE utiliza **JavaScript** como lenguaje de programación base a través de una consola de código en lÃnea. -- - Sin embargo, podemos encontrar otras API's y plataformas que nos proporcionan diferentes niveles de acceso. <center> <img src="data:image/png;base64,#esquema.jpg" width="750px" /> <center> --- ### Catálogo de datos disponibles. <center> <img src="data:image/png;base64,#engine_data.jpg" width="800px" /> <center> <center> GEE, 2020 <center> --- ### Ventajas y desventajas de GEE: -- .pull-left[ * **Ventajas:** + Amplias capacidades computacionales. + Rapidez para realizar procesos complejos. + Amplios catálogos de información. + Interfaz 'amigable' con el usuario principiante. ] -- .pull-right[ * **Desventajas:** + Requiere habilidades programaticas de JS (u otro lenguaje) para elaborar procesos más complejos. + Capacidad almacenamiento personal es limitada (almacenamiento de Google Drive, Assets). + Actualmente es gratuito, esto puede cambiar en el futuro. + No es funcional para procesos dependientes del entorno aún (ejemplo: análisis de redes, drenaje, etc.) ] <center> <img src="data:image/png;base64,#balanza.png" width="200px"/> <center> --- ### Interfaz. -- - **Code Editor:** nos dirige a la consola de engine para comenzar a trabajar. -- - **Documentation:** nos dirige a la pagina de GEE donde podemos encontrar una serie de manuales para el procesamiento de informacion satelital. <center> <img src="data:image/png;base64,#pantallazo.jpg" width="900px"/> <center> --- ### Editor de codigo: <center> <img src="data:image/png;base64,#interfaz_gee_2.jpg" width="1000px"/> <center> --- ### Documentación: <center> <img src="data:image/png;base64,#DOCUMENTATION.jpg" width="900px"/> <center> --- --- ### Introducción a JavaScript. #### Tipos de variables: - **Strings:** Variables de texto o cadenas de caracteres, se utilizan las comillas simples o dobles para definir una cadena. ``` js // Usamos comillas simples o dobles para crear un string var saludoString = 'Hola Mundo!!'; print( saludoString ); ``` - **Números:** En estas variables podemos almacenar números de distinta longitud y precisión. ``` js // Asignamos un número a una variable var numero = 38; print('El valor es:', numero); ``` --- - **Listas:** Las listas las definimos con corchetes [ ]. En GEE son útiles para realizar selecciones de elementos y podemos almacenar números, caracteres u otros elementos. ``` js // Lista de números var listDeNumeros = [0, 1, 1, 2, 3, 5]; print('Lista de Números:', listDeNumeros); // Lista de strings. var listDeStrings = ['a', 'b', 'c', 'd']; print('Lista de strings:', listDeStrings); // lista alfanumerica: var lista3 = ["lunes", 34, "miercoles", 70]; print(lista3, "lista alfanum"); ``` --- - **Diccionarios:** * Los diccionarios JS hacen mención a una estructura que puede contener otros valores definidos por {}. * Se utilizan claves para nombrar las variables contenidas en su interior las cuales pueden ser llamadas del forma individual o completa. ``` js // Usamos las llaves {} para hacer un diccionario de pares clave:valor var object = { foo: 'bar', baz: 38, stuff: ['Algo', 'eso', 'otro más'] }; print('Diccionario:', object); // Para acceder al valor de un diccionario se utiliza la clave y los corchetes [ ]. print('Imprime la clave foo:', object['foo']); // También se puede acceder utilizando la notación con punto. print('Print stuff:', object.stuff); ``` -- - Los diccionarios a diferencia de las listas, son objetos mas complejos dentro de JS y Engine que permiten almacenar distintos tipos de variables en su interior. -- - En cuanto a su funcionalidad, los diccionarios cumplen el mismo propósito que otros objetos, la diferencia está en la creación y el tipo **contenedor .ee** a utilizar. --- - **Funciones:**Las funciones son otra forma de mejorar la legibilidad y reutilización del código mediante el agrupamiento de operaciones. * Una función se define mediante __function()__ en nuestro script. * Los nombres de las funciones comienzan con un caracter y tienen un par de paréntesis al final. * Las funciones a menudo toman parámetros para definir su objetivo. ``` js // Ejemplo de cómo se define una función var funcion_saludo = function(nombre) { var mensaje = '¡Hola! ' + nombre + ' ¿Qué hora es?'; return mensaje; }; // llamamos a la función con su parámetro. print(funcion_saludo('José')); ``` * El conjunto de declaraciones que componen la función van dentro de las llaves { }. * Finalmente, return indica cual es la salida de la función. --- ### Contenedores de GEE. - GEE posee contenedores especificos dentro de la API (.ee) para cada tipo de objeto, permitiendo enviar dicha información para ser procesada en los servidores. ``` js // Definimos un string y lo agregamos al contenedor var unString = 'procesando'; var eeString = ee.String(unString); print('Donde estabas? ', eeString); ``` - Trabajar con estos contenedores asegura la optimización del trabajo y la velocidad del mismo. - No utilizar los contenedores en nuestras variables puede derivar en los "cuellos de botella", los cuales ralentizan el procesamiento al ejecutar el código en nuestro lado (Client-side). - **Nota relevante**: Los contenedores de GEE se crean de manera diferente respecto a los objetos recién vistos. Estos poseen una estructura propia para ser <b>creados</b>, <b>subseteados</b> y <b>procesados</b>. --- - **Números:** - Podemos usar `ee.Number()` para crear un objeto número en el servidor. Tomemos como ejemplo el método JavaScript **Math.E** para crear un valor de la constante en el servidor: ``` js // Definimos un número en el servidor var serverNumber = ee.Number(Math.E); print('e = ', serverNumber); ``` - Los métodos `ee.String()` y `ee.Number()` son constructores, y por tanto, tienen argumentos adicionbales que se pueden considerar. - Un constructor comienza siempre con **ee.** y retorna un objeto **EE**. <center> <img src="data:image/png;base64,#numero_e.jpg" width="250px"/> <center> --- ### Métodos en un objeto EE -- - Para operar con un objeto de EE debemos utilizar los métodos que son provistos según la clase de objeto con la que pretendemos trabajar. - Existen múltiples métodos para operar dentro de GEE. ``` js // Utilice una función incorporada para realizar una operación en el número. var logE = serverNumber.log(); print('log(e) = ', logE); ``` -- - **Listas:** Podemos hacer una lista como un objeto `ee.List` en el servidor, pasando una lista simple de JS **['something', 'something else']**. ``` js // Ejemplos de listas, secuencia por extensión var eeList = ee.List([1, 2, 3, 4, 5]); // Secuencia usando el método del objeto list var secuencia = ee.List.sequence(1, 5); print('Secuencia:', secuencia); ``` --- - Podemos recuperar un elemento de la lista con el operador `get()`. -- - **Importante**: Recuerde que esta lista solo existe en el servidor, EE nos permite acceder a esos objetos solo a través de sus métodos. ``` js // Usamos un método de ee.List para recuperar un valor var valor = secuencia.get(2); print('Valor en la posición 2:', valor); ``` -- - **Diccionarios:** Podemos crear un diccionario en EE a partir de un objeto JavaScript, de la misma manera que lo hicimos con String, Number y List. La función `ee.Dictionary`: ``` js // Crear un diccionario en el servidor var diccionario = ee.Dictionary({ e: Math.E, pi: Math.PI, phi: (1 + Math.sqrt(5)) / 2 }); // Recuperar algunos valores desde el diccionario. print('Euler:', diccionario.get('e')); print('Pi:', diccionario.get('pi')); print('Golden ratio:', diccionario.get('phi')); // Recuperar todas las claves print('Claves: ', diccionario.keys()); ``` --- - **Fechas**: Los objetos de tipo **ee.Date** nos permiten representar tiempo. -- - Al igual que con los otros tipos de datos, <b>NO</b> se debe confundir entre objetos Date de JavaScript y el ee.Date de EE. ``` js // Definir una fecha en Earth Engine. var fecha = ee.Date('2015-12-31'); print('Fecha:', fecha); // Recuperar la fecha actual usando el método Date.now() de JavaScript. var now = Date.now(); print('Milisegundos desde el 1 de Enero de 1970', now); // Inicializar el objeto ee.Date var eeNow = ee.Date(now); print('Now:', eeNow); ``` - Los objetos fechas son muy importantes para filtrar las colecciones, utilizando la función `filterDate()`. --- ### Recordatorios: 1) Cada vez que se desee declarar una variable se debe iniciar con la palabra <b>var</b> y para finalizar una lÃnea de código se debe finalizar con <b>;</b> 2) Uso de paréntesis: * Los <b>()</b> hacen referencia a una función. Sin embargo, también sirven para conformar un conjunto lógico. * Los <b>[]</b> sirven para construir arrays o listas. * Los <b>{ }</b> normalmente sirven para formar objetos. Por ejemplo:los parámetros u opciones que se le pueden dar a un gráfico, algoritmo o alguna función en especÃfico. 3) Es una buena práctica poner comentarios en el código, para describir lo que se está tratando de hacer. También es bueno eliminar el código comentado que ya no hace nada. Ambas prácticas mejorarán la legibilidad del código. --- ### Recordatorios: 4) Los objetos y funciones de GEE a diferencia del común de JavaScript se caracterizan principalmente por: * Usar al inicio <b style = 'color : #8000FF;'>ee.</b> * Todos los elementos en <b style = 'color : #8000FF;'>color violeta</b>, hacen referencia a una función implÃcitas de GEE. * Los elementos en <b style = 'color : #00ff00;'>color verde</b> hacen referencia a comentarios. * Las lÃneas de en <b style = 'color : #FF3333;'>color rojo</b> hacen referencia a conjuntos de valores descritos dentro de un metadato. Asimismo, sirven para asignar nombres, colores y configuraciones o parámetros de algunas funciones o algoritmos. * Los elementos que se muestran en <b style = 'color : #33A8FF;'>color azul</b>, hacen referencia a valores numéricos. --- ### BibliografÃa. GORELICK, N., HANCHER, M., DIXON, M., ILYUSHCHENKO, S., THAU, D. y MOORE, R., 2017. Google Earth Engine: Planetary-scale geospatial analysis for everyone. Remote Sensing of Environment [en lÃnea], vol. 202, pp. 18-27. ISSN 00344257. DOI 10.1016/j.rse.2017.06.031. Disponible en: https://doi.org/10.1016/j.rse.2017.06.031. REDD, P.R.R. de E. por D. y D. de B. en C. y R.D., 2018. Introducción a Javascript para Google Earth Engine (GEE). Deutsche Gesellschaft für Internationale Zusammenarbeit (GIZ) [en lÃnea], vol. 1. Disponible en: https://www.sica.int/download/?124837. Google Earth Engine. (s. f.). https://earthengine.google.com/ Pérez, J. E. (2008). introducción JavaScript. Madrid, España. --- class: middle 